#ifndef __CONV_1x1_H
#define __CONV_1x1_H

#include "operation.h"

namespace mslite {

class Conv1x1: public Operation {
public:
    Conv1x1(cl_context context, cl_device_id device, std::string clKernelName, std::vector<int> ishape, std::vector<int> wshape);
    virtual ~Conv1x1() = default;
    cl_int prepareMem(void) override;
    cl_int setParams(void) override;
    // cl_int getOutut(cl_command_queue commandQueue, std::vector<std::vector<float>> &output) override;
};

class Conv1x1Naive: public Conv1x1 {
public:
    Conv1x1Naive(cl_context context, cl_device_id device, std::vector<int> ishape, std::vector<int> wshape);
    virtual ~Conv1x1Naive() = default;
    cl_int bind(void) override;
};

class Conv1x1Tflite: public Conv1x1 {
public:
    Conv1x1Tflite(cl_context context, cl_device_id device, std::vector<int> ishape, std::vector<int> wshape);
    virtual ~Conv1x1Tflite() = default;
    cl_int bind(void) override;
};

class Conv1x1Image2d: public Conv1x1 {
public:
    Conv1x1Image2d(cl_context context, cl_device_id device, std::vector<int> ishape, std::vector<int> wshape);
    virtual ~Conv1x1Image2d() = default;
    cl_int prepareMem(void) override;
    cl_int bind(void) override;
};

}

#endif